package com.wrl.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Main2 {

    /**
     * 动态代理
     */
    public static void main(String[] args) {

        //1. 创建业务对象
        TestServiceImpl testService = new TestServiceImpl();

        //2. 获取对应的classLoader
        ClassLoader classLoader = testService.getClass().getClassLoader();

        //3. 获取所有接口的class（这里只有一个）
        Class[] interfaces = testService.getClass().getInterfaces();

        //4. 创建一个将传给代理类的调用请求处理器，处理所有的代理对象上的方法调用(这里创建的是一个自定义日志处理器)
        InvocationHandler logHandler = new LogHandler(testService);

        /*
          5. 创建代理对象，此过程中：
             a. JDK会通过根据传入的参数信息动态地在内存中创建和.class文件等同的字节码
             b. 然后根据相应的字节码转换成对应的class
             c. 然后调用newInstance()创建代理实例
         */
        TestService proxy = (TestService) Proxy.newProxyInstance(classLoader, interfaces, logHandler);
        proxy.save();
        proxy.select();

    }

}
